home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 334_02 / setshow.c < prev    next >
Text File  |  1991-02-04  |  47KB  |  1,867 lines

  1. /* GNUPLOT - setshow.c */
  2. /*
  3.  * Copyright (C) 1986, 1987, 1990   Thomas Williams, Colin Kelley
  4.  *
  5.  * Permission to use, copy, and distribute this software and its
  6.  * documentation for any purpose with or without fee is hereby granted, 
  7.  * provided that the above copyright notice appear in all copies and 
  8.  * that both that copyright notice and this permission notice appear 
  9.  * in supporting documentation.
  10.  *
  11.  * Permission to modify the software is granted, but not the right to
  12.  * distribute the modified code.  Modifications are to be distributed 
  13.  * as patches to released version.
  14.  *  
  15.  * This software  is provided "as is" without express or implied warranty.
  16.  * 
  17.  *
  18.  * AUTHORS
  19.  * 
  20.  *   Original Software:
  21.  *     Thomas Williams,  Colin Kelley.
  22.  * 
  23.  *   Gnuplot 2.0 additions:
  24.  *       Russell Lang, Dave Kotz, John Campbell.
  25.  * 
  26.  * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
  27.  * 
  28.  */
  29.  
  30. #include <stdio.h>
  31. #include <math.h>
  32. #include "plot.h"
  33. #include "setshow.h"
  34.  
  35. #define DEF_FORMAT   "%g"    /* default format for tic mark labels */
  36. #define SIGNIF (0.01)        /* less than one hundredth of a tic mark */
  37.  
  38. /*
  39.  * global variables to hold status of 'set' options
  40.  *
  41.  */
  42. BOOLEAN            autoscale_t    = TRUE;
  43. BOOLEAN            autoscale_x    = TRUE;
  44. BOOLEAN            autoscale_y    = TRUE;
  45. BOOLEAN            autoscale_lt    = TRUE;
  46. BOOLEAN            autoscale_lx    = TRUE;
  47. BOOLEAN            autoscale_ly    = TRUE;
  48. BOOLEAN                clip_points    = FALSE;
  49. BOOLEAN                clip_lines1    = TRUE;
  50. BOOLEAN                clip_lines2    = FALSE;
  51. char            dummy_var[MAX_ID_LEN+1] = "x";
  52. char            xformat[MAX_ID_LEN+1] = DEF_FORMAT;
  53. char            yformat[MAX_ID_LEN+1] = DEF_FORMAT;
  54. enum PLOT_STYLE data_style    = POINTS,
  55.                 func_style    = LINES;
  56. BOOLEAN            grid        = FALSE;
  57. int                key            = -1;    /* default position */
  58. double            key_x, key_y;        /* user specified position for key */
  59. BOOLEAN            log_x        = FALSE,
  60.                 log_y        = FALSE;
  61. FILE*            outfile;
  62. char            outstr[MAX_ID_LEN+1] = "STDOUT";
  63. BOOLEAN            polar        = FALSE;
  64. BOOLEAN            parametric    = FALSE;
  65. int                samples        = SAMPLES;
  66. float            xsize        = 1.0;  /* scale factor for size */
  67. float            ysize        = 1.0;  /* scale factor for size */
  68. int                term        = 0;                /* unknown term is 0 */
  69. char            title[MAX_LINE_LEN+1] = "";
  70. char            xlabel[MAX_LINE_LEN+1] = "";
  71. char            ylabel[MAX_LINE_LEN+1] = "";
  72. double            tmin        = -5.0,
  73.                 tmax        =  5.0,
  74.                 xmin        = -10.0,
  75.                 xmax        = 10.0,
  76.                 ymin        = -10.0,
  77.                 ymax        = 10.0;
  78. double            loff        = 0.0,
  79.                 roff        = 0.0,
  80.                 toff        = 0.0,
  81.                 boff        = 0.0;
  82. double            zero = ZERO;            /* zero threshold, not 0! */
  83.  
  84. BOOLEAN xzeroaxis = TRUE;
  85. BOOLEAN yzeroaxis = TRUE;
  86.  
  87. BOOLEAN xtics = TRUE;
  88. BOOLEAN ytics = TRUE;
  89.  
  90. struct ticdef xticdef = {TIC_COMPUTED};
  91. struct ticdef yticdef = {TIC_COMPUTED};
  92.  
  93. BOOLEAN            tic_in        = TRUE;
  94.  
  95. struct text_label *first_label = NULL;
  96. struct arrow_def *first_arrow = NULL;
  97.  
  98. /*** other things we need *****/
  99. extern char *strcpy(),*strcat();
  100. extern int strlen();
  101. extern FILE *popen();
  102.  
  103. /* input data, parsing variables */
  104. extern struct lexical_unit token[];
  105. extern char input_line[];
  106. extern int num_tokens, c_token;
  107.  
  108. extern char replot_line[];
  109. extern struct udvt_entry *first_udv;
  110.  
  111. extern double magnitude(),real();
  112. extern struct value *const_express();
  113.  
  114. /******** Local functions ********/
  115. static void set_label();
  116. static void set_nolabel();
  117. static void set_arrow();
  118. static void set_noarrow();
  119. static void load_tics();
  120. static void load_tic_user();
  121. static void free_marklist();
  122. static void load_tic_series();
  123. static void load_offsets();
  124.  
  125. static void show_style(), show_range(), show_zero();
  126. static void show_offsets(), show_output(), show_samples(), show_size();
  127. static void show_title(), show_xlabel(), show_ylabel();
  128. static void show_xzeroaxis(), show_yzeroaxis();
  129. static void show_label(), show_arrow(), show_grid(), show_key();
  130. static void show_polar(), show_parametric(), show_tics(), show_ticdef();
  131. static void show_term(), show_plot(), show_autoscale(), show_clip();
  132. static void show_format(), show_logscale(), show_variables();
  133.  
  134. static void delete_label();
  135. static int assign_label_tag();
  136. static void delete_arrow();
  137. static int assign_arrow_tag();
  138.  
  139. /******** The 'set' command ********/
  140. void
  141. set_command()
  142. {
  143.      static char testfile[MAX_LINE_LEN+1];
  144. #ifdef unix
  145.      static BOOLEAN pipe_open = FALSE;
  146. #endif
  147.  
  148.     c_token++;
  149.  
  150.     if (almost_equals(c_token,"ar$row")) {
  151.         c_token++;
  152.         set_arrow();
  153.     }
  154.     else if (almost_equals(c_token,"noar$row")) {
  155.         c_token++;
  156.         set_noarrow();
  157.     }
  158.      else if (almost_equals(c_token,"au$toscale")) {
  159.         c_token++;
  160.         if (END_OF_COMMAND) {
  161.            autoscale_t = autoscale_x = autoscale_y = TRUE;
  162.         } else if (equals(c_token, "xy") || equals(c_token, "yx")) {
  163.            autoscale_x = autoscale_y = TRUE;
  164.            c_token++;
  165.         } else if (equals(c_token, "t")) {
  166.            autoscale_t = TRUE;
  167.            c_token++;
  168.         } else if (equals(c_token, "x")) {
  169.            autoscale_x = TRUE;
  170.            c_token++;
  171.         } else if (equals(c_token, "y")) {
  172.            autoscale_y = TRUE;
  173.            c_token++;
  174.         }
  175.     } 
  176.     else if (almost_equals(c_token,"noau$toscale")) {
  177.         c_token++;
  178.         if (END_OF_COMMAND) {
  179.            autoscale_t = autoscale_x = autoscale_y = FALSE;
  180.         } else if (equals(c_token, "xy") || equals(c_token, "tyx")) {
  181.            autoscale_x = autoscale_y = FALSE;
  182.            c_token++;
  183.         } else if (equals(c_token, "t")) {
  184.            autoscale_t = FALSE;
  185.            c_token++;
  186.         } else if (equals(c_token, "x")) {
  187.            autoscale_x = FALSE;
  188.            c_token++;
  189.         } else if (equals(c_token, "y")) {
  190.            autoscale_y = FALSE;
  191.            c_token++;
  192.         }
  193.     } 
  194.     else if (almost_equals(c_token,"c$lip")) {
  195.         c_token++;
  196.         if (END_OF_COMMAND)
  197.          /* assuming same as points */
  198.          clip_points = TRUE;
  199.         else if (almost_equals(c_token, "p$oints"))
  200.          clip_points = TRUE;
  201.         else if (almost_equals(c_token, "o$ne"))
  202.          clip_lines1 = TRUE;
  203.         else if (almost_equals(c_token, "t$wo"))
  204.          clip_lines2 = TRUE;
  205.         else
  206.          int_error("expecting 'points', 'one', or 'two'", c_token);
  207.         c_token++;
  208.     }
  209.     else if (almost_equals(c_token,"noc$lip")) {
  210.         c_token++;
  211.         if (END_OF_COMMAND) {
  212.            /* same as all three */
  213.            clip_points = FALSE;
  214.            clip_lines1 = FALSE;
  215.            clip_lines2 = FALSE;
  216.         } else if (almost_equals(c_token, "p$oints"))
  217.          clip_points = FALSE;
  218.         else if (almost_equals(c_token, "o$ne"))
  219.          clip_lines1 = FALSE;
  220.         else if (almost_equals(c_token, "t$wo"))
  221.          clip_lines2 = FALSE;
  222.         else
  223.          int_error("expecting 'points', 'one', or 'two'", c_token);
  224.         c_token++;
  225.     }
  226.     else if (almost_equals(c_token,"d$ata")) {
  227.         c_token++;
  228.         if (!almost_equals(c_token,"s$tyle"))
  229.             int_error("expecting keyword 'style'",c_token);
  230.         data_style = get_style();
  231.     }
  232.     else if (almost_equals(c_token,"d$ummy")) {
  233.         c_token++;
  234.         if (END_OF_COMMAND)
  235.             int_error("expecting dummy variable name", c_token);
  236.         else
  237.             copy_str(dummy_var,c_token++);
  238.     }
  239.     else if (almost_equals(c_token,"fo$rmat")) {
  240.         BOOLEAN setx, sety;
  241.         c_token++;
  242.         if (equals(c_token,"x")) {
  243.             setx = TRUE; sety = FALSE;
  244.             c_token++;
  245.         }
  246.         else if (equals(c_token,"y")) {
  247.             setx = FALSE; sety = TRUE;
  248.             c_token++;
  249.         }
  250.         else if (equals(c_token,"xy") || equals(c_token,"yx")) {
  251.             setx = sety = TRUE;
  252.             c_token++;
  253.         }
  254.         else if (isstring(c_token) || END_OF_COMMAND) {
  255.             /* Assume he wants both */
  256.             setx = sety = TRUE;
  257.         }
  258.         if (END_OF_COMMAND) {
  259.             if (setx)
  260.                 (void) strcpy(xformat,DEF_FORMAT);
  261.             if (sety)
  262.                 (void) strcpy(yformat,DEF_FORMAT);
  263.         }
  264.         else {
  265.             if (!isstring(c_token))
  266.               int_error("expecting format string",c_token);
  267.             else {
  268.                 if (setx)
  269.                  quote_str(xformat,c_token);
  270.                 if (sety)
  271.                  quote_str(yformat,c_token);
  272.                 c_token++;
  273.             }
  274.         }
  275.     }
  276.     else if (almost_equals(c_token,"fu$nction")) {
  277.         c_token++;
  278.         if (!almost_equals(c_token,"s$tyle"))
  279.             int_error("expecting keyword 'style'",c_token);
  280.         func_style = get_style();
  281.     }
  282.     else if (almost_equals(c_token,"la$bel")) {
  283.         c_token++;
  284.         set_label();
  285.     }
  286.     else if (almost_equals(c_token,"nola$bel")) {
  287.         c_token++;
  288.         set_nolabel();
  289.     }
  290.     else if (almost_equals(c_token,"lo